﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.Net;
using System.Text.RegularExpressions;

namespace PringlesPlugins
{
    [Serializable()]
    internal sealed class InfoPringles
    {
        [XmlAttribute()]
        public int Quantidade { get; set; }
        [XmlAttribute()]
        public double Valor { get; set; }

        public InfoPringles()
        {
        }

        public InfoPringles(int quantidade, double valor)
        {
            Quantidade = quantidade;
            Valor = valor;
        }
    }

    internal class PringlesClass
    {
        private interface IConsultaPringles
        {
            List<SPrecoPringles> Ofertas();
        }

        private struct SPrecoPringles
        {
            public readonly string Estabelecimento;
            public readonly string NomeOferta;
            public readonly double Preco;

            public SPrecoPringles(string estabelecimento, string nomeOferta, double preco)
            {
                Estabelecimento = estabelecimento;
                NomeOferta = nomeOferta;
                Preco = preco;
            }
        }

        private class ConsultaBase
        {
            protected string Consulta(string url)
            {
                try
                {
                    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                    req.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
                    using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
                    {
                        using (System.IO.StreamReader read = new System.IO.StreamReader(resp.GetResponseStream(), Encoding.GetEncoding(resp.CharacterSet)))
                        {
                            return read.ReadToEnd();
                        }
                    }
                }
                catch
                {
                    return string.Empty;
                }
            }
        }

        private class LojasAmericanas : ConsultaBase, IConsultaPringles
        {
            private const string c_url = "http://www.americanas.com.br/busca/pringles";
            private List<SPrecoPringles> _produtos = new List<SPrecoPringles>();

            #region ConsultaPringles Members
            public List<SPrecoPringles> Ofertas()
            {
                return _produtos;
            }
            #endregion

            public LojasAmericanas()
            {
                string paginaConsulta = base.Consulta(c_url);
                MatchCollection ms = Regex.Matches(paginaConsulta, @"<strong class=""n name fn"">(?<nome>.*?)</strong>.*?<span class=""sale price"">Por:\s*R\$\s*(?<preco>[\d,]+).*?</span>", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.ExplicitCapture);
                if (ms.Count > 0)
                {
                    foreach (Match m in ms)
                    {
                        _produtos.Add(new SPrecoPringles("Lojas Americanas", System.Web.HttpUtility.HtmlDecode(m.Groups["nome"].Value), Convert.ToDouble(m.Groups["preco"].Value)));
                    }
                }
            }
        }

        private class Buscape : ConsultaBase, IConsultaPringles
        {
            private const string c_url = "http://busca.buscape.com.br/cprocura/pringles.html";
            private List<SPrecoPringles> _produtos = new List<SPrecoPringles>();

            public List<SPrecoPringles> Ofertas()
            {
                return _produtos;
            }

            public Buscape()
            {
                string paginaConsulta = base.Consulta(c_url);                                
                MatchCollection ms = Regex.Matches(paginaConsulta, @"<EM><strong>PRINGLES</strong></EM>.*?(?<gramas>\d+?)G</a>.*?class=""xl2"" target=_blank>R\$\s*(?<preco>[\d,]+)</a>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
                if (ms.Count > 0)
                {
                    foreach (Match m in ms)
                    {
                        if (Convert.ToInt32(m.Groups["gramas"].Value) > 100)
                        {
                            _produtos.Add(new SPrecoPringles(string.Empty, string.Empty, Convert.ToDouble(m.Groups["preco"].Value)));
                        }
                    }
                }
            }
        }
        
        private List<SPrecoPringles> _pringles = new List<SPrecoPringles>();

        public PringlesClass()
        {
        }

        public void AtualizarPrecos()
        {
            _pringles.Clear();
            //LojasAmericanas loja1 = new LojasAmericanas();
            Buscape loja1 = new Buscape();            
            _pringles.AddRange(loja1.Ofertas());
        }

        public double PrecoMedio()
        {
            try
            {
                return _pringles.Average((a) => a.Preco);
            }
            catch (InvalidOperationException)
            {
                return 0;
            }
        }
    }
}
